home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldbmp08
/
ldbmp08s.lzh
/
LDBMP24.S
< prev
next >
Wrap
Text File
|
1997-09-15
|
19KB
|
987 lines
*****************************************************************
* フルカラー用 *
*****************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xdef _Bit24_conv
.xdef _Bit24_prt
.xdef _Bit24_scroll
.xdef _Bit24_rewrite
.xref _Gxput
.xref key_chk
.xref tenkey_chk
.xref cursor_chk
.xref mouse_chk
.xref scroll_int
.xref gr_on0
.xref gr_int0
.xref gr_off0
.xref x_set
.xref y_set
.xref v_wait
.xref inf_change
.xref line_byte
.xref tate
.xref yoko
.xref x_max
.xref y_max
.xref x_pos
.xref y_pos
.xref iro
.xref gr_addr
.xref d_pat
.xref kflg
.xref dflg
.xref mflg
.xref esc_flg
.xref next_flg
.xref resize_flg
.xref scroll_key
.xref s_dot24
*****************************************************************
* 画像データをコンバート *
*****************************************************************
_Bit24_conv:
bsr irohen24 *full color変換(最初の1画面)
rts
*****************************************************************
* 表示 *
*****************************************************************
_Bit24_prt:
bsr bit24_prt *表示(最初の1画面)
rts
*****************************************************************
* スクロール *
*****************************************************************
_Bit24_scroll:
bsr scroll *スクロール
rts
*****************************************************************
* 画面の描き直し *
*****************************************************************
_Bit24_rewrite:
bsr esc_rewrite
rts
*****************************************************************
* 画像データをコンバート *
*****************************************************************
irohen24:
moveq.l #0,d0 *変換開始ライン番号
move.w tate(pc),d1 *変換ライン数
cmp.w #512,d1
bcs irohen24_
move.w #512,d1
irohen24_:
bsr conv24
rts
conv24:
clr.w bmp_x *変換元,変換先アドレス取得
move.w d0,bmp_y
bsr get_bmp_addr
movea.l a1,a0
move.w line_byte(pc),d0 *次のラインへの差分
add.w yoko(pc),d0 *(変換先)
add.w yoko(pc),d0
movea.w d0,a3
movea.l a3,a2 *次のラインへの差分を計算
adda.w yoko(pc),a2 *(変換元)
movea.w yoko(pc),a4 *横ループ
move.w d1,d5 *縦ループ
subq.w #1,a4
subq.w #1,d5
move.w #$00f8,d7 *マスクデータ
tst.b dflg *ディザもどきあり?
beq d_nashi *指定無し
lea.l d_pat(pc),a5
moveq.l #3,d3
move.w bmp_y(pc),d4
conv24_1:
move.w a4,d6 *横ループ
move.w d4,d0
and.w d3,d0
add.w d0,d0
add.w d0,d0
lea.l 0(a5,d0.w),a6
conv24_2
move.w d6,d0
and.w d3,d0
move.b 0(a6,d0.w),d0
move.b (a0)+,d1 *B
add.b d0,d1
bcc conv24_2_
moveq.l #31*2,d1
bra conv24_3
conv24_2_:
and.w d7,d1
lsr.b #2,d1
conv24_3:
move.b (a0)+,d2 *G
add.b d0,d2
bcc conv24_3_
ori.w #$f800,d1
bra conv24_4
conv24_3_:
and.w d7,d2
* ror.w #8,d2
move.b d2,-(sp) *ror.w #8,d2の代わり
move.w (sp)+,d2 *
clr.b d2 *
or.w d2,d1
conv24_4
move.b (a0)+,d2 *R
add.b d0,d2
bcc conv24_4_
ori.w #$07c0,d1
bra conv24_5
conv24_4_
and.w d7,d2
rol.w #3,d2
or.w d2,d1
conv24_5
move.w d1,(a1)+
dbra d6,conv24_2
suba.l a2,a0
suba.l a3,a1
addq.w #1,d4
dbra d5,conv24_1
rts
d_nashi: *ディザもどきなし
move.w a4,d6 *横ループ
d_nashi1
move.b (a0)+,d0 *B
move.b (a0)+,d1 *G
move.b (a0)+,d2 *R
and.w d7,d0
and.w d7,d1
and.w d7,d2
lsr.w #2,d0
lsl.w #3,d2
* lsl.w #8,d1
move.b d1,-(sp) *lsl.w #8,d1の代わり
move.w (sp)+,d1 *
clr.b d1 *
or.w d1,d0
or.w d2,d0 *GRB
move.w d0,(a1)+
dbra.w d6,d_nashi1
suba.l a2,a0
suba.l a3,a1
dbra.w d5,d_nashi
rts
*****************************************************************
* 画像データを一気に表示する *
*****************************************************************
bit24_prt:
move.w x_pos(pc),gram_x *表示開始座標
move.w y_pos(pc),gram_y
clr.w bmp_x
clr.w bmp_y
move.w yoko(pc),d0
cmp.w #512,d0 *横ドット数が512を超えるか
bls bit24_prt1
move.w #512,d0
bit24_prt1:
move.w d0,bmp_xd
move.w d0,x_line
move.w tate(pc),d0
cmp.w #512,d0 *横ドット数が512を超えるか
bls bit24_prt2
move.w #512,d0
bit24_prt2:
move.w d0,bmp_yd
move.w d0,y_line
bsr get_bmp_addr
bsr get_gram_addr
tst.b mflg
bne bit24_prt3
bsr dma_move *DMAで表示
bra bit24_prt4
bit24_prt3:
bsr g24 *MPUで表示
bit24_prt4:
rts
*****************************************************************
* DMAを使ってグラフィックへ転送する *
*****************************************************************
dma_move:
move.w bmp_yd(pc),d0 *転送サイズ縦
move.w bmp_xd(pc),d1 *転送サイズ横
movea.w line_byte(pc),a3 *転送元画像の横サイズ
sub.w #1,d0 *縦ライン-1
move.b #$FF,CSR2
move.b #8,DCR2
btst.l #0,d1 *横ライン数が偶数か
beq dma_move0 *そう
move.b #$11,OCR2 *ワード転送
bra dma_move1
dma_move0:
move.b #$21,OCR2 *ロングワード転送
lsr.w #1,d1 *d1を1/2
dma_move1:
move.b #%0_000_0101,SCR2
move.b #3,CPR2
clr.b CCR2
move.b #5,DFC2
move.b #5,MFC2
dma_move2:
move.w d1,MTC2 *転送サイズ
move.l a1,MAR2 *転送元
move.l a2,DAR2 *転送先
move.b #$80,CCR2
dma_move3:
tst.w MTC2
bne dma_move3
move.b #$FF,CSR2
suba.l a3,a1 *転送元アドレス更新
lea.l 1024(a2),a2 *転送先アドレス更新
dbra.w d0,dma_move2
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
moveq.l #0,d2 *スクロール座標初期化
moveq.l #0,d3
clr.w x_old
clr.w y_old
bsr down_demo
bsr right_demo
tst.b kflg *キー入力待ち
beq scroll8 *指定無し
scroll2:
bsr key_chk *キー入力チェック
* bsr mouse_chk *マウスのキー入力チェック
tst.b esc_flg *エスケープ入力
bne scroll9
tst.b next_flg *ネクスト入力
bne scroll9
tst.b resize_flg *縮小表示
bne scroll6
bsr cursor_chk *カーソル入力チェック
bsr tenkey_chk *テンキー入力チェック
bsr mouse_chk *マウス入力チェック
bsr go_scroll *スクロール実行
bsr v_wait *手抜き
bra scroll2 *キー入力に戻る
scroll6: *一画面表示
bsr gr_off0
bsr gr_int0
bsr gr_on0
bsr scroll_int
bsr resize
scroll6_:
bsr key_chk
bsr mouse_chk
tst.b esc_flg
bne scroll9
tst.b next_flg
bne scroll9
tst.b resize_flg
bne scroll6_
scroll7: *書き戻し
bsr gr_off0
bsr gr_int0
bsr gr_on0
bsr rewrite
bra scroll2
scroll8:
bsr key_chk *ESCくらいは入力チェック
bsr mouse_chk *マウスのキー入力チェック
scroll9:
rts
*****************************************************************
* 一画面表示 *
*****************************************************************
resize:
bsr parm_set
pea.l arg_ptr(pc)
bsr _Gxput
addq.l #4,sp
rts
parm_set:
lea.l arg_ptr(pc),a0
bsr resize_get
move.w d0,4(a0)
move.w d1,6(a0)
clr.w gram_x
clr.w gram_y
move.w #512,d2 *X方向のセンタリング
sub.w d0,d2
bmi parm_set0
lsr.w #1,d2
move.w d2,gram_x
parm_set0:
move.w #512,d3 *Y方向
sub.w d1,d3
bmi parm_set1
lsr.w #1,d3
move.w d3,gram_y
parm_set1:
bsr get_gram_addr
move.l a2,(a0)
addq.l #8,a0
clr.w bmp_x
clr.w bmp_y
bsr get_bmp_addr
move.l a1,(a0)+
move.w yoko(pc),(a0)+
move.w tate(pc),(a0)+
move.w line_byte(pc),(a0)+
lea.l work_tbl(pc),a1
move.l a1,(a0)+
rts
resize_get:
move.w tate(pc),d0 *縦サイズと横サイズを比べる
cmp.w yoko(pc),d0
beq resize_get2
bhi resize_get1
resize_get0:
move.w #512,d0 *横の方が大きい
move.w tate(pc),d1
mulu.w #512,d1
divu.w yoko(pc),d1
rts
resize_get1:
move.w yoko(pc),d0 *縦の方が大きい
mulu.w #512,d0
divu.w tate(pc),d0
move.w #512,d1
rts
resize_get2:
move.w #512,d0 *同じ
move.w #512,d1
rts
*****************************************************************
* 下方向へ全画面スクロールを行う *
*****************************************************************
down_demo:
tst.w y_max
beq down_demo9
cmp.w #24,iro
beq down_demo1
move.w s_dot24(pc),-(sp)
lsr.w s_dot24
down_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne down_demo8
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr v_wait
bsr down
cmp.w y_max(pc),d3
bne down_demo0
bra down_demo8
down_demo1:
move.w s_dot24(pc),-(sp)
move.w #1,s_dot24
down_demo2:
bsr key_chk
bsr mouse_chk
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr demo_conv
* bsr v_wait
bsr down
cmp.w y_max(pc),d3
bne down_demo2
down_demo8:
move.w (sp)+,s_dot24
down_demo9:
rts
demo_conv: *分割コンバート
movem.l d0-d7/a0-a6,-(sp)
move.w d3,d0
add.w #512,d0
move.w y_max(pc),d1
sub.w d3,d1
cmp.w s_dot24(pc),d1
bls demo_conv_
move.w s_dot24(pc),d1
demo_conv_:
bsr conv24
movem.l (sp)+,d0-d7/a0-a6
rts
*****************************************************************
* 右方向へ全画面スクロールを行う *
*****************************************************************
right_demo:
tst.w x_max
beq right_demo9
tst.w d3
bne right_demo9
* move.w y_max(pc),d0
* cmp.w x_max(pc),d0
* bhi right_demo9
move.w s_dot24(pc),-(sp)
lsr.w s_dot24
right_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne right_demo8
tst.b esc_flg
bne right_demo8
tst.b next_flg
bne right_demo8
bsr v_wait
bsr right
cmp.w x_max(pc),d2
bne right_demo0
right_demo8:
move.w (sp)+,s_dot24
right_demo9:
rts
*****************************************************************
* スクロール *
*****************************************************************
go_scroll:
moveq.l #0,d0
move.b scroll_key(pc),d0
add.w d0,d0
add.w d0,d0
movea.l scroll_tbl(pc,d0.w),a0
jsr (a0)
rts
scroll_tbl:
.dc.l null *0000 入力無し
.dc.l left *0001 左
.dc.l up *0010 上
.dc.l left_up *0011 上左
.dc.l right *0100 右
.dc.l null *0101 右左
.dc.l right_up *0110 右上
.dc.l up *0111 右上左
.dc.l down *1000 下
.dc.l left_down *1001 下左
.dc.l null *1010 下上
.dc.l left *1011 下上左
.dc.l right_down *1100 下右
.dc.l down *1101 下右左
.dc.l right *1110 下右上
.dc.l null *1111 下右上左
.even
*****************************************************************
* 入力無し *
*****************************************************************
null:
rts
*****************************************************************
* 右下(手抜き) *
*****************************************************************
right_down:
bsr right
bsr down
rts
*****************************************************************
* 左下(手抜き) *
*****************************************************************
left_down:
bsr left
bsr down
rts
*****************************************************************
* 右上(手抜き) *
*****************************************************************
right_up:
bsr right
bsr up
rts
*****************************************************************
* 左上(手抜き) *
*****************************************************************
left_up:
bsr left
bsr up
rts
*****************************************************************
* 左へ *
*****************************************************************
left:
sub.w s_dot24(pc),d2
tst.w d2
bpl left1
clr.w d2
left1:
bsr x_set
move.w x_old(pc),d5 *何ドットずらすか
sub.w d2,d5
beq left9
move.w d2,d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w d2,bmp_x
move.w d5,bmp_xd
move.w y_old(pc),bmp_y
move.w y_line(pc),bmp_yd
bsr get_bmp_addr *表示
bsr get_gram_addr
bsr g24
move.w d2,x_old
left9:
rts
*****************************************************************
* 上へ *
*****************************************************************
up:
sub.w s_dot24(pc),d3
tst.w d3
bpl up1
clr.w d3
up1:
move.w y_old(pc),d6 *何ドットずらすか
sub.w d3,d6
beq up9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w d3,d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),bmp_x
move.w x_line(pc),bmp_xd
move.w d3,bmp_y
move.w d6,bmp_yd
bsr get_bmp_addr
bsr get_gram_addr
bsr g24
bsr y_set
move.w d3,y_old
up9:
rts
*****************************************************************
* 右へ *
*****************************************************************
right:
add.w s_dot24(pc),d2
cmp.w x_max(pc),d2
bls right1
move.w x_max(pc),d2
right1:
bsr x_set
move.w d2,d5 *何ドットずらすか
sub.w x_old(pc),d5
beq right9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
add.w #512,d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),bmp_x
add.w #512,bmp_x
move.w d5,bmp_xd
move.w y_old(pc),bmp_y
move.w y_line(pc),bmp_yd
bsr get_bmp_addr *表示
bsr get_gram_addr
bsr g24
move.w d2,x_old
right9:
rts
*****************************************************************
* 下へ *
*****************************************************************
down:
add.w s_dot24(pc),d3
cmp.w y_max(pc),d3
bls down1
move.w y_max(pc),d3
down1:
bsr y_set
move.w d3,d6 *何ドットずらすか
sub.w y_old(pc),d6
beq down9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),bmp_x
move.w x_line(pc),bmp_xd
move.w y_old(pc),bmp_y
add.w #512,bmp_y
move.w d6,bmp_yd
bsr get_bmp_addr *表示
bsr get_gram_addr
bsr g24
move.w d3,y_old
down9:
rts
*****************************************************************
* 一画面表示後の描き戻し *
*****************************************************************
rewrite:
move.w x_old(pc),d2
move.w y_old(pc),d3
move.w d2,d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w d3,d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w d2,bmp_x
move.w x_line(pc),bmp_xd
move.w d3,bmp_y
move.w y_line(pc),bmp_yd
bsr get_bmp_addr *表示
bsr get_gram_addr
bsr x_set
bsr y_set
bsr g24
rts
*****************************************************************
* 終了時の描き戻し *
*****************************************************************
esc_rewrite:
move.w x_pos(pc),gram_x *表示開始X座標
move.w y_pos(pc),gram_y *表示開始Y座標
move.w d2,bmp_x
move.w x_line(pc),bmp_xd
move.w d3,bmp_y
move.w y_line(pc),bmp_yd
clr.w d2
clr.w d3
bsr get_bmp_addr *表示
bsr get_gram_addr
bsr x_set
bsr y_set
bsr g24
rts
*****************************************************************
* スクロール分のグラフィックを表示する *
* gram_x, gram_y 表示先座標(GRAM) *
* bmp_x, bmp_y 表示元座標(BMP) *
* bmp_xd, bmp_yd ドット数 *
*****************************************************************
g24:
movem.l d5-d6,-(sp)
move.w bmp_xd(pc),d0 *横ドット数
move.w bmp_yd(pc),d7 *縦ドット数
move.w line_byte(pc),d4 *次のラインへのバイト数
add.w d0,d4 *(転送元)
add.w d0,d4
move.w #512,d5 *表示データの1ライン下までの差分
sub.w d0,d5 *(表示先)
add.w d5,d5
move.w gram_x(pc),d6
add.w bmp_xd(pc),d6
cmp.w #512,d6
bhi g24_2 *左右2回に分けて表示
cmp.w #1,d0 *表示ライン=横1ドット
beq g24_1
cmp.w #8,d0 *表示ライン=横8ドット
beq g24_8
btst.l #0,d0
beq g24_g *表示ライン=偶数
bra g24_k *表示ライン=奇数
g24_1:
subq.w #1,d7 *dbraのため縦-1
g24_11:
move.w (a1)+,(a2)+
suba.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_13
suba.l #GRAM_MAX-GRAM,a2
g24_13:
dbra d7,g24_11
bra g24_end
g24_8:
subq.w #1,d7 *dbraのため縦-1
g24_81:
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
suba.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_83
suba.l #GRAM_MAX-GRAM,a2
g24_83:
dbra d7,g24_81
bra g24_end
g24_g:
lsr.w #1,d0 *1/2
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_g1:
move.w d0,d1
g24_g2:
move.l (a1)+,(a2)+
dbra d1,g24_g2
suba.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_g3
suba.l #GRAM_MAX-GRAM,a2
g24_g3:
dbra d7,g24_g1
bra g24_end
g24_k:
lsr.w #1,d0 *1/2
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_k1:
move.w d0,d1
g24_k2:
move.l (a1)+,(a2)+
dbra d1,g24_k2
move.w (a1)+,(a2)+
suba.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_k3
suba.l #GRAM_MAX-GRAM,a2
g24_k3:
dbra d7,g24_k1
bra g24_end
g24_2: *左右2回に分けて表示
add.w #1024,d5 *1ライン下までの差分を補正
move.w #512,d0 *横ドット1
sub.w gram_x(pc),d0
move.w bmp_xd(pc),d6 *横ドット2
sub.w d0,d6
subq.w #1,d0 *dbraのため-1
subq.w #1,d6 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_21:
move.w d0,d1 *右側
g24_22:
move.w (a1)+,(a2)+
dbra d1,g24_22
g24_23:
move.w d6,d1 *左側
lea.l -1024(a2),a2
g24_24:
move.w (a1)+,(a2)+
dbra d1,g24_24
suba.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_25
suba.l #GRAM_MAX-GRAM,a2
g24_25:
dbra d7,g24_21
g24_end:
movem.l (sp)+,d5-d6
rts
*****************************************************************
* BMPデータのアドレスを取得(a1) *
*****************************************************************
get_bmp_addr:
move.w tate(pc),d0 *(tate-1-bmp_y)*line_byte+bmp_x*2+gr_addr
subq.w #1,d0
sub.w bmp_y(pc),d0
mulu.w line_byte(pc),d0
add.l gr_addr(pc),d0
movea.l d0,a1
adda.w bmp_x(pc),a1
adda.w bmp_x(pc),a1
rts
*****************************************************************
* GRAMのアドレスを取得(a2) *
*****************************************************************
get_gram_addr:
move.w gram_x(pc),d0 *表示先画像アドレス
move.w gram_y(pc),d1
swap.w d1
clr.w d1
ror.l #6,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
adda.l #GRAM,a2
movea.l #GRAM_MAX,a3 *GRAM_MAX
rts
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
gram_x .ds.w 1 *表示する座標(GRAM)
gram_y .ds.w 1
bmp_x .ds.w 1 *表示する座標(BMP)
bmp_y .ds.w 1
bmp_xd .ds.w 1 *表示するドット数
bmp_yd .ds.w 1
x_line:
.ds.w 1 *横ドット数
y_line:
.ds.w 1 *縦ドット数
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
arg_ptr:
.ds.b 4+2*2+4+2*2+2+4
work_tbl:
.ds.b 1024
.even